library(assertr)
Warning: package ‘assertr’ was built under R version 4.2.1

candy_2015 <- read_xlsx("raw_data/boing-boing-candy-2015.xlsx") %>%
  clean_names()
candy_2016 <- read_xlsx("raw_data/boing-boing-candy-2016.xlsx") %>%
  clean_names()
candy_2017 <- read_xlsx("raw_data/boing-boing-candy-2017.xlsx") %>%
  clean_names()
New names:

candy_2015
candy_2016
candy_2017
NA
NA
names_2016
  [1] "internal_id"                                                                      "q1_going_out"                                                                    
  [3] "q2_gender"                                                                        "q3_age"                                                                          
  [5] "q4_country"                                                                       "q5_state_province_county_etc"                                                    
  [7] "q6_100_grand_bar"                                                                 "q6_anonymous_brown_globs_that_come_in_black_and_orange_wrappers_a_k_a_mary_janes"
  [9] "q6_any_full_sized_candy_bar"                                                      "q6_black_jacks"                                                                  
 [11] "q6_bonkers_the_candy"                                                             "q6_bonkers_the_board_game"                                                       
 [13] "q6_bottle_caps"                                                                   "q6_boxo_raisins"                                                                 
 [15] "q6_broken_glow_stick"                                                             "q6_butterfinger"                                                                 
 [17] "q6_cadbury_creme_eggs"                                                            "q6_candy_corn"                                                                   
 [19] "q6_candy_that_is_clearly_just_the_stuff_given_out_for_free_at_restaurants"        "q6_caramellos"                                                                   
 [21] "q6_cash_or_other_forms_of_legal_tender"                                           "q6_chardonnay"                                                                   
 [23] "q6_chick_o_sticks_we_don_t_know_what_that_is"                                     "q6_chiclets"                                                                     
 [25] "q6_coffee_crisp"                                                                  "q6_creepy_religious_comics_chick_tracts"                                         
 [27] "q6_dental_paraphenalia"                                                           "q6_dots"                                                                         
 [29] "q6_dove_bars"                                                                     "q6_fuzzy_peaches"                                                                
 [31] "q6_generic_brand_acetaminophen"                                                   "q6_glow_sticks"                                                                  
 [33] "q6_goo_goo_clusters"                                                              "q6_good_n_plenty"                                                                
 [35] "q6_gum_from_baseball_cards"                                                       "q6_gummy_bears_straight_up"                                                      
 [37] "q6_hard_candy"                                                                    "q6_healthy_fruit"                                                                
 [39] "q6_heath_bar"                                                                     "q6_hersheys_dark_chocolate"                                                      
 [41] "q6_hershey_s_milk_chocolate"                                                      "q6_hersheys_kisses"                                                              
 [43] "q6_hugs_actual_physical_hugs"                                                     "q6_jolly_rancher_bad_flavor"                                                     
 [45] "q6_jolly_ranchers_good_flavor"                                                    "q6_joy_joy_mit_iodine"                                                           
 [47] "q6_junior_mints"                                                                  "q6_senior_mints"                                                                 
 [49] "q6_kale_smoothie"                                                                 "q6_kinder_happy_hippo"                                                           
 [51] "q6_kit_kat"                                                                       "q6_laffy_taffy"                                                                  
 [53] "q6_lemon_heads"                                                                   "q6_licorice_not_black"                                                           
 [55] "q6_licorice_yes_black"                                                            "q6_lindt_truffle"                                                                
 [57] "q6_lollipops"                                                                     "q6_mars"                                                                         
 [59] "q6_maynards"                                                                      "q6_mike_and_ike"                                                                 
 [61] "q6_milk_duds"                                                                     "q6_milky_way"                                                                    
 [63] "q6_regular_m_ms"                                                                  "q6_peanut_m_m_s"                                                                 
 [65] "q6_blue_m_ms"                                                                     "q6_red_m_ms"                                                                     
 [67] "q6_green_party_m_ms"                                                              "q6_independent_m_ms"                                                             
 [69] "q6_abstained_from_m_ming"                                                         "q6_minibags_of_chips"                                                            
 [71] "q6_mint_kisses"                                                                   "q6_mint_juleps"                                                                  
 [73] "q6_mr_goodbar"                                                                    "q6_necco_wafers"                                                                 
 [75] "q6_nerds"                                                                         "q6_nestle_crunch"                                                                
 [77] "q6_nown_laters"                                                                   "q6_peeps"                                                                        
 [79] "q6_pencils"                                                                       "q6_pixy_stix"                                                                    
 [81] "q6_real_housewives_of_orange_county_season_9_blue_ray"                            "q6_reese_s_peanut_butter_cups"                                                   
 [83] "q6_reeses_pieces"                                                                 "q6_reggie_jackson_bar"                                                           
 [85] "q6_rolos"                                                                         "q6_sandwich_sized_bags_filled_with_boo_berry_crunch"                             
 [87] "q6_skittles"                                                                      "q6_smarties_american"                                                            
 [89] "q6_smarties_commonwealth"                                                         "q6_snickers"                                                                     
 [91] "q6_sourpatch_kids_i_e_abominations_of_nature"                                     "q6_spotted_dick"                                                                 
 [93] "q6_starburst"                                                                     "q6_sweet_tarts"                                                                  
 [95] "q6_swedish_fish"                                                                  "q6_sweetums_a_friend_to_diabetes"                                                
 [97] "q6_take_5"                                                                        "q6_tic_tacs"                                                                     
 [99] "q6_those_odd_marshmallow_circus_peanut_things"                                    "q6_three_musketeers"                                                             
[101] "q6_tolberone_something_or_other"                                                  "q6_trail_mix"                                                                    
[103] "q6_twix"                                                                          "q6_vials_of_pure_high_fructose_corn_syrup_for_main_lining_into_your_vein"        
[105] "q6_vicodin"                                                                       "q6_whatchamacallit_bars"                                                         
[107] "q6_white_bread"                                                                   "q6_whole_wheat_anything"                                                         
[109] "q6_york_peppermint_patties"                                                       "q7_joy_other"                                                                    
[111] "q8_despair_other"                                                                 "q9_other_comments"                                                               
[113] "q10_dress"                                                                        "x114"                                                                            
[115] "q11_day"                                                                          "q12_media_daily_dish"                                                            
[117] "q12_media_science"                                                                "q12_media_espn"                                                                  
[119] "q12_media_yahoo"                                                                  "click_coordinates_x_y"                                                           

Clean 2015 data


candy_cleaned_2015 <- candy_2015 %>% 
  rename(age = how_old_are_you, 
         going_out = are_you_going_actually_going_trick_or_treating_yourself) %>% 
  mutate(year = str_extract(timestamp, '[0-9]{1,4}'), .after = timestamp) %>%
  mutate(id = row_number(timestamp) + 1e6) %>% 
  mutate(country = NA_character_, .after = age) %>% 
  #mutate(is_going_out = ifelse(is_going_out == "Yes",T, F)) %>% 
  select(id, year:york_peppermint_patties, necco_wafers) %>% 
  # replace all non integer age inputs as NA, convert values to integers
  mutate(age = as.integer(age), year = as.integer(year)) %>% 
  pivot_longer(butterfinger:necco_wafers, names_to = "candy_name", values_to = "rating") %>% 
  select(id, year, going_out, age, country, candy_name, rating)
Warning: NAs introduced by coercionWarning: NAs introduced by coercion to integer range
# maybe pivot_longer for combining three datasets
candy_cleaned_2015

Clean 2016 data


candy_cleaned_2016 <- candy_2016 %>% 
  rename(going_out = are_you_going_actually_going_trick_or_treating_yourself,
         age = how_old_are_you,
         country = which_country_do_you_live_in,
         gender = your_gender) %>%
  mutate(id = row_number(timestamp) + 2e6, .before = timestamp) %>% 
  mutate(year = str_extract(timestamp, '[0-9]{1,4}'), .after = timestamp) %>%
  clean_country_names() %>% 
  select(id, year:york_peppermint_patties, -gender, -which_state_province_county_do_you_live_in) %>% 
  # replace all non integer age inputs as NA, convert values to integers
  mutate(age = as.integer(age), year = as.integer(year)) %>% 
  #pivot_longer(x100_grand_bar:york_peppermint_patties, names_to = "candy_name", values_to = "rating")
  pivot_longer(x100_grand_bar:york_peppermint_patties, names_to = "candy_name", values_to = "rating") %>% 
  select(id, year, going_out, age, country, candy_name, rating)
Warning: NAs introduced by coercionWarning: NAs introduced by coercion to integer range
candy_cleaned_2016
NA

candy_cleaned_2017 <- candy_2017 %>% 
  rename(id = internal_id) %>% 
 # rename(id = internal_id) %>% 
  pivot_longer(q1_going_out:q11_day, names_to = "col_names", values_to = "value") %>%
  select(id, col_names, value) %>%
  mutate(col_names = str_remove(col_names, "q[0-9]_")) %>%
  pivot_wider(names_from = col_names, values_from = value) %>%
  clean_names() %>%
  mutate(year = as.integer(2017), .after = id) %>%
  mutate(age = as.integer(age)) %>% 
  clean_country_names() %>% 
  pivot_longer(x100_grand_bar:york_peppermint_patties, names_to = "candy_name", values_to = "rating") %>% 
  select(id, year, going_out, age, country, candy_name, rating)
Warning: NAs introduced by coercion
candy_cleaned_2017

Summary of countries No cleaning = 118 unique countries Remove non character values = Lowercase = 96 unique countries


clean_country_names <- function(dataframe){
  
us_list <- c("merica", "ahemamerca", "alaska", "america","california","murica",
             "murrika","newjersey","newyork","northcarolina","pittsburgh",
             "trumpistan", "unhingedstates", "uniedstates","unitestates",
             "unitesstates", "uniteds", "us", "theunitedstates",
             "theunitedstatesofamerica", "unitedsates", "unitedstaes",
             "ipretendtobefromcanada,butiamreallyfromtheunitedstates",
             "unitedstate", "unitedstatea", "unitedstated", "usofa", "ussa",
             "ud", "USA", "sub-canadiannorthamericamerica",
             "theyooessofaaayyyyyy", "unitsstates")

uk_list <- c("endland", "england", "scotland", "uk", "unitedkingdom",
             "unitedkindom")

canada_list <- c("can", "canada")

exclude_list <- c("a", "canae", "cascadia", "earth", "fearandloathing",
                  "idontknowanymore", "insanitylately", "namerica", "narnia",
                  "sovietcanuckistan", "subscribetodmuzonyoutube", "denial",
                  "godscountry", "neverland", "oneofthebestones", "seeabove",
                  "somewhere", "eua", "thereisntoneforoldmen",
                  "therepublicofcascadia", "thisone")
  
  dataframe %>%
    mutate(country = str_remove_all(country, "[0-9]*"),
         country = str_to_lower(country),
         country = str_remove_all(country, "[`.' !?0-9]"),
         country = if_else(str_detect(country, "uniteds"),"USA", country),
         country = if_else(str_detect(country, "usa"),"USA", country)) %>% 
    mutate(country = case_when(
      country %in% us_list ~ "USA",
      country %in% uk_list ~ "UK",
      country %in% canada_list ~ "Canada",
      country %in% exclude_list ~ NA_character_,
      !is.na(country) & country != "" ~ "Other"
      ), .after = country)
}

Bind tables together


candy_cleaned_2015 %>% 
  bind_rows(candy_cleaned_2016) %>% 
  bind_rows(candy_cleaned_2017) %>% 
  distinct(candy_name) %>% 
  arrange(candy_name)
NA
candy_cleaned_2015
candy_cleaned_2016
candy_cleaned_2017

Analysis questions What is the total number of candy ratings given across the three years. (Number of candy ratings, not the number of raters. Don’t count missing values) #just a list of all the candy ratings What was the average age of people who are going out trick or treating? # age column What was the average age of people who are not going trick or treating? # age column For each of joy, despair and meh, which candy bar received the most of these ratings? # candy ratings How many people rated Starburst as despair? # starburst column (candy columns)

For the next three questions, count despair as -1, joy as +1, and meh as 0.

What was the most popular candy bar by this rating system for each gender in the dataset ? # candy ratings What was the most popular candy bar in each year? # date or year What was the most popular candy bar by this rating for people in US, Canada, UK, and all other countries? # countries

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoYXNzZXJ0cikNCg0KDQpgYGANCg0KYGBge3J9DQoNCmNhbmR5XzIwMTUgPC0gcmVhZF94bHN4KCJyYXdfZGF0YS9ib2luZy1ib2luZy1jYW5keS0yMDE1Lnhsc3giKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KY2FuZHlfMjAxNiA8LSByZWFkX3hsc3goInJhd19kYXRhL2JvaW5nLWJvaW5nLWNhbmR5LTIwMTYueGxzeCIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQpjYW5keV8yMDE3IDwtIHJlYWRfeGxzeCgicmF3X2RhdGEvYm9pbmctYm9pbmctY2FuZHktMjAxNy54bHN4IikgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpjYW5keV8yMDE1DQpjYW5keV8yMDE2DQpjYW5keV8yMDE3DQoNCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KDQpuYW1lc18yMDE1IDwtIG5hbWVzKGNhbmR5XzIwMTUpDQpuYW1lc18yMDE2IDwtIG5hbWVzKGNhbmR5XzIwMTYpDQpuYW1lc18yMDE3IDwtIG5hbWVzKGNhbmR5XzIwMTcpDQoNCmBgYA0KDQojIyMgQ2xlYW4gMjAxNSBkYXRhDQoNCmBgYHtyfQ0KDQpjYW5keV9jbGVhbmVkXzIwMTUgPC0gY2FuZHlfMjAxNSAlPiUgDQogIHJlbmFtZShhZ2UgPSBob3dfb2xkX2FyZV95b3UsIA0KICAgICAgICAgZ29pbmdfb3V0ID0gYXJlX3lvdV9nb2luZ19hY3R1YWxseV9nb2luZ190cmlja19vcl90cmVhdGluZ195b3Vyc2VsZikgJT4lIA0KICBtdXRhdGUoeWVhciA9IHN0cl9leHRyYWN0KHRpbWVzdGFtcCwgJ1swLTldezEsNH0nKSwgLmFmdGVyID0gdGltZXN0YW1wKSAlPiUNCiAgbXV0YXRlKGlkID0gcm93X251bWJlcih0aW1lc3RhbXApICsgMWU2KSAlPiUgDQogIG11dGF0ZShjb3VudHJ5ID0gTkFfY2hhcmFjdGVyXywgLmFmdGVyID0gYWdlKSAlPiUgDQogICNtdXRhdGUoaXNfZ29pbmdfb3V0ID0gaWZlbHNlKGlzX2dvaW5nX291dCA9PSAiWWVzIixULCBGKSkgJT4lIA0KICBzZWxlY3QoaWQsIHllYXI6eW9ya19wZXBwZXJtaW50X3BhdHRpZXMsIG5lY2NvX3dhZmVycykgJT4lIA0KICAjIHJlcGxhY2UgYWxsIG5vbiBpbnRlZ2VyIGFnZSBpbnB1dHMgYXMgTkEsIGNvbnZlcnQgdmFsdWVzIHRvIGludGVnZXJzDQogIG11dGF0ZShhZ2UgPSBhcy5pbnRlZ2VyKGFnZSksIHllYXIgPSBhcy5pbnRlZ2VyKHllYXIpKSAlPiUgDQogIHBpdm90X2xvbmdlcihidXR0ZXJmaW5nZXI6bmVjY29fd2FmZXJzLCBuYW1lc190byA9ICJjYW5keV9uYW1lIiwgdmFsdWVzX3RvID0gInJhdGluZyIpICU+JSANCiAgc2VsZWN0KGlkLCB5ZWFyLCBnb2luZ19vdXQsIGFnZSwgY291bnRyeSwgY2FuZHlfbmFtZSwgcmF0aW5nKQ0KDQoNCiMgbWF5YmUgcGl2b3RfbG9uZ2VyIGZvciBjb21iaW5pbmcgdGhyZWUgZGF0YXNldHMNCmNhbmR5X2NsZWFuZWRfMjAxNQ0KYGBgDQoNCiMjIyBDbGVhbiAyMDE2IGRhdGENCg0KYGBge3J9DQoNCmNhbmR5X2NsZWFuZWRfMjAxNiA8LSBjYW5keV8yMDE2ICU+JSANCiAgcmVuYW1lKGdvaW5nX291dCA9IGFyZV95b3VfZ29pbmdfYWN0dWFsbHlfZ29pbmdfdHJpY2tfb3JfdHJlYXRpbmdfeW91cnNlbGYsDQogICAgICAgICBhZ2UgPSBob3dfb2xkX2FyZV95b3UsDQogICAgICAgICBjb3VudHJ5ID0gd2hpY2hfY291bnRyeV9kb195b3VfbGl2ZV9pbiwNCiAgICAgICAgIGdlbmRlciA9IHlvdXJfZ2VuZGVyKSAlPiUNCiAgbXV0YXRlKGlkID0gcm93X251bWJlcih0aW1lc3RhbXApICsgMmU2LCAuYmVmb3JlID0gdGltZXN0YW1wKSAlPiUgDQogIG11dGF0ZSh5ZWFyID0gc3RyX2V4dHJhY3QodGltZXN0YW1wLCAnWzAtOV17MSw0fScpLCAuYWZ0ZXIgPSB0aW1lc3RhbXApICU+JQ0KICBjbGVhbl9jb3VudHJ5X25hbWVzKCkgJT4lIA0KICBzZWxlY3QoaWQsIHllYXI6eW9ya19wZXBwZXJtaW50X3BhdHRpZXMsIC1nZW5kZXIsIC13aGljaF9zdGF0ZV9wcm92aW5jZV9jb3VudHlfZG9feW91X2xpdmVfaW4pICU+JSANCiAgIyByZXBsYWNlIGFsbCBub24gaW50ZWdlciBhZ2UgaW5wdXRzIGFzIE5BLCBjb252ZXJ0IHZhbHVlcyB0byBpbnRlZ2Vycw0KICBtdXRhdGUoYWdlID0gYXMuaW50ZWdlcihhZ2UpLCB5ZWFyID0gYXMuaW50ZWdlcih5ZWFyKSkgJT4lIA0KICAjcGl2b3RfbG9uZ2VyKHgxMDBfZ3JhbmRfYmFyOnlvcmtfcGVwcGVybWludF9wYXR0aWVzLCBuYW1lc190byA9ICJjYW5keV9uYW1lIiwgdmFsdWVzX3RvID0gInJhdGluZyIpDQogIHBpdm90X2xvbmdlcih4MTAwX2dyYW5kX2Jhcjp5b3JrX3BlcHBlcm1pbnRfcGF0dGllcywgbmFtZXNfdG8gPSAiY2FuZHlfbmFtZSIsIHZhbHVlc190byA9ICJyYXRpbmciKSAlPiUgDQogIHNlbGVjdChpZCwgeWVhciwgZ29pbmdfb3V0LCBhZ2UsIGNvdW50cnksIGNhbmR5X25hbWUsIHJhdGluZykNCg0KDQpjYW5keV9jbGVhbmVkXzIwMTYNCg0KYGBgDQoNCmBgYHtyfQ0KDQpjYW5keV9jbGVhbmVkXzIwMTcgPC0gY2FuZHlfMjAxNyAlPiUgDQogIHJlbmFtZShpZCA9IGludGVybmFsX2lkKSAlPiUgDQogIyByZW5hbWUoaWQgPSBpbnRlcm5hbF9pZCkgJT4lIA0KICBwaXZvdF9sb25nZXIocTFfZ29pbmdfb3V0OnExMV9kYXksIG5hbWVzX3RvID0gImNvbF9uYW1lcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQ0KICBzZWxlY3QoaWQsIGNvbF9uYW1lcywgdmFsdWUpICU+JQ0KICBtdXRhdGUoY29sX25hbWVzID0gc3RyX3JlbW92ZShjb2xfbmFtZXMsICJxWzAtOV1fIikpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29sX25hbWVzLCB2YWx1ZXNfZnJvbSA9IHZhbHVlKSAlPiUNCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgbXV0YXRlKHllYXIgPSBhcy5pbnRlZ2VyKDIwMTcpLCAuYWZ0ZXIgPSBpZCkgJT4lDQogIG11dGF0ZShhZ2UgPSBhcy5pbnRlZ2VyKGFnZSkpICU+JSANCiAgY2xlYW5fY291bnRyeV9uYW1lcygpICU+JSANCiAgcGl2b3RfbG9uZ2VyKHgxMDBfZ3JhbmRfYmFyOnlvcmtfcGVwcGVybWludF9wYXR0aWVzLCBuYW1lc190byA9ICJjYW5keV9uYW1lIiwgdmFsdWVzX3RvID0gInJhdGluZyIpICU+JSANCiAgc2VsZWN0KGlkLCB5ZWFyLCBnb2luZ19vdXQsIGFnZSwgY291bnRyeSwgY2FuZHlfbmFtZSwgcmF0aW5nKQ0KDQpjYW5keV9jbGVhbmVkXzIwMTcNCmBgYA0KDQpTdW1tYXJ5IG9mIGNvdW50cmllcw0KTm8gY2xlYW5pbmcgPSAxMTggdW5pcXVlIGNvdW50cmllcw0KUmVtb3ZlIG5vbiBjaGFyYWN0ZXIgdmFsdWVzID0gDQpMb3dlcmNhc2UgPSA5NiB1bmlxdWUgY291bnRyaWVzDQoNCmBgYHtyfQ0KDQpjbGVhbl9jb3VudHJ5X25hbWVzIDwtIGZ1bmN0aW9uKGRhdGFmcmFtZSl7DQogIA0KdXNfbGlzdCA8LSBjKCJtZXJpY2EiLCAiYWhlbWFtZXJjYSIsICJhbGFza2EiLCAiYW1lcmljYSIsImNhbGlmb3JuaWEiLCJtdXJpY2EiLA0KICAgICAgICAgICAgICJtdXJyaWthIiwibmV3amVyc2V5IiwibmV3eW9yayIsIm5vcnRoY2Fyb2xpbmEiLCJwaXR0c2J1cmdoIiwNCiAgICAgICAgICAgICAidHJ1bXBpc3RhbiIsICJ1bmhpbmdlZHN0YXRlcyIsICJ1bmllZHN0YXRlcyIsInVuaXRlc3RhdGVzIiwNCiAgICAgICAgICAgICAidW5pdGVzc3RhdGVzIiwgInVuaXRlZHMiLCAidXMiLCAidGhldW5pdGVkc3RhdGVzIiwNCiAgICAgICAgICAgICAidGhldW5pdGVkc3RhdGVzb2ZhbWVyaWNhIiwgInVuaXRlZHNhdGVzIiwgInVuaXRlZHN0YWVzIiwNCiAgICAgICAgICAgICAiaXByZXRlbmR0b2JlZnJvbWNhbmFkYSxidXRpYW1yZWFsbHlmcm9tdGhldW5pdGVkc3RhdGVzIiwNCiAgICAgICAgICAgICAidW5pdGVkc3RhdGUiLCAidW5pdGVkc3RhdGVhIiwgInVuaXRlZHN0YXRlZCIsICJ1c29mYSIsICJ1c3NhIiwNCiAgICAgICAgICAgICAidWQiLCAiVVNBIiwgInN1Yi1jYW5hZGlhbm5vcnRoYW1lcmljYW1lcmljYSIsDQogICAgICAgICAgICAgInRoZXlvb2Vzc29mYWFheXl5eXl5IiwgInVuaXRzc3RhdGVzIikNCg0KdWtfbGlzdCA8LSBjKCJlbmRsYW5kIiwgImVuZ2xhbmQiLCAic2NvdGxhbmQiLCAidWsiLCAidW5pdGVka2luZ2RvbSIsDQogICAgICAgICAgICAgInVuaXRlZGtpbmRvbSIpDQoNCmNhbmFkYV9saXN0IDwtIGMoImNhbiIsICJjYW5hZGEiKQ0KDQpleGNsdWRlX2xpc3QgPC0gYygiYSIsICJjYW5hZSIsICJjYXNjYWRpYSIsICJlYXJ0aCIsICJmZWFyYW5kbG9hdGhpbmciLA0KICAgICAgICAgICAgICAgICAgImlkb250a25vd2FueW1vcmUiLCAiaW5zYW5pdHlsYXRlbHkiLCAibmFtZXJpY2EiLCAibmFybmlhIiwNCiAgICAgICAgICAgICAgICAgICJzb3ZpZXRjYW51Y2tpc3RhbiIsICJzdWJzY3JpYmV0b2RtdXpvbnlvdXR1YmUiLCAiZGVuaWFsIiwNCiAgICAgICAgICAgICAgICAgICJnb2RzY291bnRyeSIsICJuZXZlcmxhbmQiLCAib25lb2Z0aGViZXN0b25lcyIsICJzZWVhYm92ZSIsDQogICAgICAgICAgICAgICAgICAic29tZXdoZXJlIiwgImV1YSIsICJ0aGVyZWlzbnRvbmVmb3JvbGRtZW4iLA0KICAgICAgICAgICAgICAgICAgInRoZXJlcHVibGljb2ZjYXNjYWRpYSIsICJ0aGlzb25lIikNCiAgDQogIGRhdGFmcmFtZSAlPiUNCiAgICBtdXRhdGUoY291bnRyeSA9IHN0cl9yZW1vdmVfYWxsKGNvdW50cnksICJbMC05XSoiKSwNCiAgICAgICAgIGNvdW50cnkgPSBzdHJfdG9fbG93ZXIoY291bnRyeSksDQogICAgICAgICBjb3VudHJ5ID0gc3RyX3JlbW92ZV9hbGwoY291bnRyeSwgIltgLicgIT8wLTldIiksDQogICAgICAgICBjb3VudHJ5ID0gaWZfZWxzZShzdHJfZGV0ZWN0KGNvdW50cnksICJ1bml0ZWRzIiksIlVTQSIsIGNvdW50cnkpLA0KICAgICAgICAgY291bnRyeSA9IGlmX2Vsc2Uoc3RyX2RldGVjdChjb3VudHJ5LCAidXNhIiksIlVTQSIsIGNvdW50cnkpKSAlPiUgDQogICAgbXV0YXRlKGNvdW50cnkgPSBjYXNlX3doZW4oDQogICAgICBjb3VudHJ5ICVpbiUgdXNfbGlzdCB+ICJVU0EiLA0KICAgICAgY291bnRyeSAlaW4lIHVrX2xpc3QgfiAiVUsiLA0KICAgICAgY291bnRyeSAlaW4lIGNhbmFkYV9saXN0IH4gIkNhbmFkYSIsDQogICAgICBjb3VudHJ5ICVpbiUgZXhjbHVkZV9saXN0IH4gTkFfY2hhcmFjdGVyXywNCiAgICAgICFpcy5uYShjb3VudHJ5KSAmIGNvdW50cnkgIT0gIiIgfiAiT3RoZXIiDQogICAgICApLCAuYWZ0ZXIgPSBjb3VudHJ5KQ0KfQ0KDQoNCmBgYA0KDQojIEJpbmQgdGFibGVzIHRvZ2V0aGVyDQoNCmBgYHtyfQ0KDQpjYW5keV9jbGVhbmVkXzIwMTUgJT4lIA0KICBiaW5kX3Jvd3MoY2FuZHlfY2xlYW5lZF8yMDE2KSAlPiUgDQogIGJpbmRfcm93cyhjYW5keV9jbGVhbmVkXzIwMTcpICU+JSANCiAgZGlzdGluY3QoY2FuZHlfbmFtZSkgJT4lIA0KICBhcnJhbmdlKGNhbmR5X25hbWUpDQoNCmBgYA0KYGBge3J9DQpjYW5keV9jbGVhbmVkXzIwMTUNCmNhbmR5X2NsZWFuZWRfMjAxNg0KY2FuZHlfY2xlYW5lZF8yMDE3DQpgYGANCg0KDQoNCkFuYWx5c2lzIHF1ZXN0aW9ucw0KV2hhdCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbmR5IHJhdGluZ3MgZ2l2ZW4gYWNyb3NzIHRoZSB0aHJlZSB5ZWFycy4gKE51bWJlciBvZiBjYW5keSByYXRpbmdzLCBub3QgdGhlIG51bWJlciBvZiByYXRlcnMuIERvbuKAmXQgY291bnQgbWlzc2luZyB2YWx1ZXMpDQojanVzdCBhIGxpc3Qgb2YgYWxsIHRoZSBjYW5keSByYXRpbmdzDQpXaGF0IHdhcyB0aGUgYXZlcmFnZSBhZ2Ugb2YgcGVvcGxlIHdobyBhcmUgZ29pbmcgb3V0IHRyaWNrIG9yIHRyZWF0aW5nPw0KIyBhZ2UgY29sdW1uDQpXaGF0IHdhcyB0aGUgYXZlcmFnZSBhZ2Ugb2YgcGVvcGxlIHdobyBhcmUgbm90IGdvaW5nIHRyaWNrIG9yIHRyZWF0aW5nPw0KIyBhZ2UgY29sdW1uDQpGb3IgZWFjaCBvZiBqb3ksIGRlc3BhaXIgYW5kIG1laCwgd2hpY2ggY2FuZHkgYmFyIHJlY2VpdmVkIHRoZSBtb3N0IG9mIHRoZXNlIHJhdGluZ3M/DQojIGNhbmR5IHJhdGluZ3MNCkhvdyBtYW55IHBlb3BsZSByYXRlZCBTdGFyYnVyc3QgYXMgZGVzcGFpcj8NCiMgc3RhcmJ1cnN0IGNvbHVtbiAoY2FuZHkgY29sdW1ucykNCg0KRm9yIHRoZSBuZXh0IHRocmVlIHF1ZXN0aW9ucywgY291bnQgZGVzcGFpciBhcyAtMSwgam95IGFzICsxLCBhbmQgbWVoIGFzIDAuDQoNCldoYXQgd2FzIHRoZSBtb3N0IHBvcHVsYXIgY2FuZHkgYmFyIGJ5IHRoaXMgcmF0aW5nIHN5c3RlbSBmb3IgZWFjaCBnZW5kZXIgaW4gdGhlIGRhdGFzZXQgPw0KIyBjYW5keSByYXRpbmdzDQpXaGF0IHdhcyB0aGUgbW9zdCBwb3B1bGFyIGNhbmR5IGJhciBpbiBlYWNoIHllYXI/DQojIGRhdGUgb3IgeWVhcg0KV2hhdCB3YXMgdGhlIG1vc3QgcG9wdWxhciBjYW5keSBiYXIgYnkgdGhpcyByYXRpbmcgZm9yIHBlb3BsZSBpbiBVUywgQ2FuYWRhLCBVSywgYW5kIGFsbCBvdGhlciBjb3VudHJpZXM/DQojIGNvdW50cmllcw==